﻿namespace Nomo.UnityCoreModule
{
    /// <summary>
    /// 为 <see cref="UnityEngine.AssetBundle"/> 类的实例添加扩展方法。
    /// </summary>
    public static class AssetBundleExtension
    {
        /// <summary>
        /// 尝试从资源包中加载资源。
        /// </summary>
        /// <param name="assetBundle">资源包。</param>
        /// <param name="name">资源名。</param>
        /// <param name="asset">资源。如果加载成功，它会被赋值。</param>
        /// <typeparam name="TAsset">资源类型。</typeparam>
        /// <returns>如果资源包里存在名为 <paramref name="name"/> 的资源，则返回 <see langword="true"/> ；否则返回 <see langword="false"/> .</returns>
        public static bool TryLoadAsset<TAsset>(this UnityEngine.AssetBundle assetBundle, string name, out TAsset asset) where TAsset : UnityEngine.Object
        {
            asset = default;

            if (!assetBundle)
            {
                return false;
            }

            if (System.Linq.Enumerable.Any(assetBundle.GetAllAssetNames(), s => System.IO.Path.GetFileNameWithoutExtension(s).Equals(name, System.StringComparison.OrdinalIgnoreCase)))
            {
                asset = assetBundle.LoadAsset<TAsset>(name);
                return true;
            }

            CoreModule.Log.Error($"在资源包 {assetBundle.name} 里找不到名为 {name} 的资源，请确认资源名称的正确性。如果此问题依旧出现，请检查资源包构建选项是否启用了 BuildAssetBundleOptions.DisableLoadAssetByFileName 兼或 BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension ，前者会使得无法用资源名加载资源（可以用全路径或者带有后缀的资源名），后者会使得无法用带有后缀的资源名加载资源（可以用全路径或者资源名）。");
            return false;
        }

        /// <summary>
        /// 安全地卸载资源包。
        /// </summary>
        /// <param name="assetBundle">资源包。</param>
        /// <param name="unloadAllLoadedObjects">是否要卸载资源包里正在被使用的资源？</param>
        public static void UnloadSafely(this UnityEngine.AssetBundle assetBundle, bool unloadAllLoadedObjects = false)
        {
            if (assetBundle)
            {
                assetBundle.Unload(unloadAllLoadedObjects);
            }
        }
    }
}
